package com.ftg.examsys.mapper;

import com.ftg.examsys.vo.UserDetailVo;
import com.ftg.examsys.vo.UserInfoVo;
import org.apache.ibatis.annotations.*;

import java.lang.reflect.Proxy;
import java.util.List;

/**
 * 用户编号操作类
 *
 * @Mapper : mybatis 提供的注解
 *      作用  ： 通过@mapper修饰的接口 采用动态代理模型 生成当前接口的代理类 (实现类)
 *
 *      mybatis把 代理类，注入spring的容器里面了
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/9/7 上午10:52
 */
@Mapper
public interface UserMapper {


    /**
     * 用来登陆功能
     *
     * @param username 用户名
     * @param password 密码
     * @return 1|0
     */
    @Select("select username,realname,gender from user left join userno on user.userno_id = userno.id where username=#{username} and password=#{password} and status = 1")
    UserInfoVo checkUser(@Param("username") String username, @Param("password") String password);

    /**
     * 用于分页功能实现的显示条数
     * @param username   用户名
     * @param start     开始页
     * @param limit     显示条数
     * @return
     */
    List<UserDetailVo> showUserDetail(@Param("username") String username, @Param("start") int start, @Param("limit") int limit);

    /**
     * 统计满足当前条件的数据的总条数
     * @param username   用户名
     * @return
     */
    int showUserCount(@Param("username") String username);


    @Insert("insert into user(username,password,realname,gender,userno_id) values(#{username},#{password},#{realname},#{gender},#{userno_id})")
    int save(@Param("username") String username, @Param("password") String password, @Param("realname") String realname, @Param("gender") byte gender, @Param("userno_id") int userno_id);

    @Select("select id from user where username =#{username}")
    int findByUsername(@Param("username") String username);

    /**
     * 列出当前用记的全部信息
     *
     * @param id 用户编号
     * @return
     */
    @Select("select user.id,user.username,user.realname,user.gender sex,userno.status,userno.number from user left join userno on user.userno_id = userno.id where user.id=#{id} and status = 1")
    UserDetailVo oneById(@Param("id") int id);

    /**
     * 列出当前id的全部角色
     *
     * @param id 用户编号
     * @return
     */
    @Select("select role_id from user_role where user_id = #{id}")
    List<Integer> oneAllRoleById(@Param("id") int id);

    /**
     * 通过传递过来的id 进行修改
     *
     * @param number  编号
     * @param status  状态
     * @param id      主键
     */
    @Update("update userno set number=#{number},status=#{status} where id = (select userno_id from user where user.id=#{id})")
    void modifyUserNoById(@Param("number") String number, @Param("status") String status, @Param("id") int id);

    /**
     * 修改用户表
     * @param udv  我们的参数
     */
    @Update("update user set username=#{udv.username},realname=#{udv.realname},gender=#{udv.sex} where id = #{udv.id}")
    void modifyUserById(@Param("udv") UserDetailVo udv);

    /**
     * 通过id删除所有角色
     * @param id 用户编号
     */
    @Delete("delete from user_role where user_id=#{id}")
    void deleteRoleByUserId(@Param("id") int id);

    /**
     * 添加中间表
     * @param userid  用户编号
     * @param roleid  角色编号
     */
    @Insert("insert into user_role(user_id, role_id) VALUES (#{userid},#{roleid})")
    void insertRole(@Param("userid")int userid, @Param("roleid")Integer roleid);

    /**
     * 根据用户主键删除
     * @param id  用户主键
     * @return
     */
    @Delete("delete from user where id=#{id}")
    int delUserById(Integer id);


    /**
     * 根据user id 查询当前用户 的userno id
     * @param id  用户 编号
     * @return  userno - id
     */
    @Select("select userno_id from user where id=#{id}")
    int findUserNoIdById(Integer id);
}
